package br.ufrj.dcc.so.forte.barbearia;

import br.ufrj.dcc.so.entidades.clientes.Cliente;
import br.ufrj.dcc.so.entidades.clientes.EnumPatente;

public interface Barbearia extends Runnable {

	/**
	 * Método que adiciona um cliente em sua determinada fila de espera.
	 * @param cliente Cliente tentando entar na fila.
	 */
	public void addClienteEspera(Cliente cliente);

	/**
	 * Método que pega o próximo cliente da patente especificada.
	 * @param patente Qual patente deve ser buscada.
	 * @return Cliente a ser atendido.
	 */
	public Cliente pegaProximoCliente(EnumPatente patente);

	/**
	 * Método que indica se há clientes de uma dada patente em espera.
	 * @param patente Patente que idica o tipo de cliente.
	 * @return Booleano que indica a existencia ou não de um cliente com a dada patente.
	 */
	public boolean possuiPatenteEspera(EnumPatente patente);
	
	
	/**
	 * Os ... funcionam como um array comum.
	 * @param func
	 */
	public void addFuncionario(Funcionario ... func);

	/**
	 * Método que deve ser chamado ao indicar que a barbearia deve fechar!
	 */
	public void fecha();

	/**
	 * Método que retorna o estado atual da barbearia.
	 * @return Configuração da barbearia no estado atual.
	 * @throws InterruptedException Caso haja algum problema na geração do estado, uma Exception é lançada. 
	 */
	public EstadoBarbearia getEstado() throws InterruptedException;
	
	public boolean isMudouEstado();



	
}
